iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

Unit Test 學習路系列 第 14

Day 13: Jest Matcher 紀錄

  • 分享至 

  • xImage
  •  

中秋夜來練習常用的 Jest Matcher:

比較是否等值

toBe()

  • 使用 Object.is 進行嚴格相等性比較。(===)
  • 主要用於基本資料類型(如:數字、字串、布林值)的比較。
  • 不適合進行物件或陣列的深度比較。
const a = 100;
const b = 100;
const c = "100";

expect(b).toBe(a); // PASS 因為兩者 Value 相等 
expect(c).toBe(a); // FAIL 因為兩者 型別不一致

但要特別注意,當使用 toBe() 進行物件比較時:

const a = {name: "Joanna"};
const b = {name: "Joanna"};
const c = a;

expect(b).toBe(a); // FAIL,因為兩者 Values not by same reference.
expect(c).toBe(a); // PASS,因為兩者 Values by same reference.

toEqual()

  • 主要用於物件類型(包含屬性值)的比較。
  • 比較屬性值(By Value)
  • 屬於 Deep Comparision,即使是多層物件,也會每次進入比較。
const a = {name: "Joanna"};
const b = {name: "Joanna"};
const c = a;

expect(b).toEqual(a); // PASS,因為兩者 擁有相同屬性與屬性值(Compared By Value)
expect(c).toEqual(a); // PASS,因為兩者 擁有相同屬性與屬性值 (With same Reference)
const obj1 = {
  level1: {
    level2: {
      level3: 'value'
    }
  }
};
const obj2 = {
  level1: {
    level2: {
      level3: 'value'
    }
  }
};

expect(obj1).toEqual(obj2); // PASS,因為兩者 每一層的 屬性 與 屬性值 皆相同。

是否包含某段字串

const string = "I have a dream.";
expect(string).toMatch(/dream/);     // 斷言想判斷字串中是否「有」包含 dream 一詞
expect(string).not.toMatch(/dream/); // 斷言想判斷字串中是否「沒有」包含 dream 一詞

想要判斷 Null, undefined, false 的情況

在寫 JavaScript if-else 判斷式中,Null, undefined, false 都會判定為 falsy 值。
但有些情況我們會想要清楚判斷值為 Null, undefined, false 時,可以使用:

  • toBeNull: 只有符合 Null 條件時成立。
  • toBeUnDefined: 只有符合 undefined 條件時成立。
  • toBeDefined: 只有「不」符合 undefined 條件時成立。(Null 是成立的)
  • toBeTruthy: if-else 符合 Truthy statement。
  • toBeFalsy: if-else 符合 Falsy statement。
expect(Null).toBeNull();           // PASS
expect(undefined).toBeNull();      // FAIL
expect(0).toBeNull();              // FAIL

expect(Null).toBeUnDefined();      // FAIL
expect(undefined).toBeUnDefined(); // PASS
expect(0).toBeUnDefined();         // FAIL

expect(Null).toBeDefined();        // PASS
expect(undefined).toBeDefined();   // FAIL
expect(0).toBeDefined();           // PASS

expect(Null).toBeTruthy();        // FAIL
expect(undefined).toBeTruthy();   // FAIL
expect(0).toBeTruthy();           // FAIL

expect(Null).toBeFalsy();         // PASS
expect(undefined).toBeFalsy();    // PASS
expect(0).toBeFalsy();            // PASS

比較數字大小

測試數字滿足某個條件時,可以使用:

  • 大於:.toBeGreaterThan(10);
  • 大於等於:.toBeGreaterThanOrEqual(10);
  • 小於:.toBeLessThan(10);
  • 小於等於:.toBeLessThanOrEqual(10);

浮點數

const value = 0.1 + 0.2;
expect(value).toBe(0.3);        // FAIL,JavaScript 二進位轉十進位無法整除
expect(value).toBeCloseTo(0.3); // PASS,接近可以成立

參考資源


上一篇
Day 12: 什麼是 Code Coverage (二)
下一篇
Day14: 關於 React Testing Library 測試
系列文
Unit Test 學習路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言